---------------
-- 运算符分类
---------------
-- 算术运算符：加+ 减- 乘* 除/ 模%
-- 逻辑运算符：AND OR LIKE BETWEEN IN EXISTS NOT ALL ANY
-- 赋值运算符：=
-- 字符串运算符：+
-- 比较运算符：=、>、 <、 >=、<=、<>
-- 位运算符：|、&、^、<<、>>
-- 复合运算符：+=、-=、*=、/=、%=

---------------
-- 运算符示例
---------------
-- 算术运算符：加+ 减- 乘* 除/ 模%
-- 已知长方形的长和宽分别为5和10，求长方形的周长和面积，并打印出来
declare  @width  int =5
declare  @length  int=10
print '面积: '+cast(@width*@length as varchar(80))
print '周长: '+cast(2*(@width+@length) as varchar(80))

-- 逻辑运算符：AND OR LIKE BETWEEN IN EXISTS NOT ALL ANY
-- 查询银行卡为冻结状态，并且余额大于1000000的银行卡信息（and）
declare @money money=1000000
select * from BankCard  where CardState=3 and CardBalance=@money

-- 查询银行卡为冻结状态，或者余额=0的银行卡信息（or）
declare @money money=0
select * from BankCard  where CardState=3 or CardBalance=@money

-- 查询姓名中含有“刘”的账户信息和银行卡信息（like）
select * from AccountInfo a
inner join BankCard b on a.AccountId=b.AccountId
where  a.RealName like '刘%'


-- 查询余额在2000 - 5000之间的银行卡信息（between）
select * from BankCard where CardBalance between 2000 and 5000

-- 查询银行卡状态为冻结或者注销的银行卡信息（in）
select * from BankCard where CardState in (3,4)


-- 关羽身份证：420107199507104133，关羽到银行来办卡
-- 查询身份证在账户表是否存在，如果不存在则先开户，否则就直接开卡就好（exists）
-- 关羽的手机号：13454788854，新开卡号：6225547858741264
declare @AccountCode varchar(80)='420107199507104133'
declare @NewCardNo varchar(19)='6225547858741264'
declare @AccountId int=(select AccountId from AccountInfo where AccountCode=@AccountCode)
if exists(select AccountId from AccountInfo where AccountCode=@AccountCode)
begin
		insert into BankCard(CardNo,AccountId,CardPwd,CardBalance,CardState,CardTime)
		values (@NewCardNo,@AccountId,'123456',1000,1,getdate())
		print '开卡成功'
end
else
begin
		 insert into AccountInfo(AccountCode,AccountPhone,RealName,OpenTime)
		 values(@AccountCode,'13454788854','关羽',getdate())
		 print '开户成功'
end



-- 查询银行卡余额，看是否都超过3000（all）
 if  (3000<all(select CardBalance from BankCard ))
	begin 
	print '所有用户余额都超过3000'
	end
	else
	begin 
	print '提示:'
	print '至少有一个用户余额没有超过3000'
	end
-- 查询银行卡余额，看是否有账户超过300000（any）
 if  (300000<any(select CardBalance from BankCard ))
	begin 

	print '提示:'
	print '至少有一个用户余额超过了300000'
	
	end
	else
	begin 
	print '所有用户余额都没超过300000'
	end


--------------------
-- 赋值运算符
--------------------
-- 已知@x=5，@y=2，声明这边两个变量，并求和，然后打印
declare @x int=5 
declare @y int=2 
print @x+@y 

--------------------
-- 字符串运算符
--------------------
-- 已知@x='Hello'，@y='world'，声明这边两个变量，连接起来，然后打印
declare @x varchar(10)='Hello'
declare @y varchar(10)='world'
print @x+'  '+@y 

--------------------
-- 比较运算符
--------------------
-- 查询身份证不为 420107199507104133 的账号
select a.CardNo as 卡号 from BankCard a 
inner join AccountInfo b on a.AccountId=b.AccountId
where b.AccountCode !='420107199507104133'

--------------------
-- 位运算符
--------------------
-- 已知@x=1，@y=5，声明这边两个变量，然后求&，|和^值，并打印出来
declare @x int =1
declare @y int =5
print @x & @y   --1
print @x | @y   --5
print ~@y       -- -6
print ~@x       -- -2


--------------------
-- 复合运算符
--------------------
-- 从银行卡 6225547858741263 取出1000元，账户余额的扣减使用复合运算符进行
update  BankCard set CardBalance-=1000 where CardNo='6225547858741263'
insert into CardExchange(CardNo,MoneyInBank,MoneyOutBank,ExchangeTime)
       values('6225547858741263',0,1000,getdate())